
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>你知道什么是覆盖索引吗？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>你知道什么是覆盖索引吗？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是覆盖索引（Covering Index）？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">覆盖索引是指一个索引包含了查询操作所需的所有列的索引。具体来说，它不仅包括查询条件中的列，还包括查询结果中的列。因为索引包含了查询所需的所有信息，数据库系统可以直接通过索引满足查询，而无需回到表中查找实际数据行。</div>
          </div>
          <div class="card-source">来源: 什么是覆盖索引</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">覆盖索引提高查询性能的核心机制是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">其核心机制是避免“回表查询”。当一个查询可以完全由索引处理时，数据库就不需要再次访问数据表中的实际行来获取数据，这减少了 I/O 操作，从而显著提高查询性能。</div>
          </div>
          <div class="card-source">来源: 覆盖索引的关键特点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">一个索引要成为特定查询的“覆盖索引”，必须满足什么条件？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该索引必须包含查询所需的所有列，这包括两部分：1. 在查询条件中使用的列（例如 WHERE 子句中的列）；2. 查询结果中需要返回的列（例如 SELECT 列表中的列）。</div>
          </div>
          <div class="card-source">来源: 覆盖索引的关键特点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">优缺点</div>
          <div class="card-question">使用覆盖索引有哪些主要的缺点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">优缺点</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">覆盖索引的主要缺点有两个：1. 占用较大的索引空间，尤其是当索引包含很多列时；2. 增加索引维护开销，因为在进行插入、更新或删除数据时，覆盖索引也需要相应维护，这会增加写操作的成本。</div>
          </div>
          <div class="card-source">来源: 覆盖索引的优缺点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">如何为查询 `SELECT order_id, amount FROM orders WHERE customer_id = 123;` 创建一个有效的覆盖索引？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">为了优化该查询，可以创建一个覆盖索引，该索引应包含查询条件列 `customer_id` 和查询结果列 `order_id`、`amount`。SQL示例为：`CREATE INDEX idx_customer_amount ON orders(customer_id, order_id, amount);`</div>
          </div>
          <div class="card-source">来源: 覆盖索引的实际应用示例</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">创建覆盖索引的基本步骤是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">创建覆盖索引的基本步骤包括：1. 分析查询需求，确定查询中涉及的所有列，包括查询条件列和查询结果列。2. 在确定了所有相关列后，创建一个包含这些列的复合索引。</div>
          </div>
          <div class="card-source">来源: 覆盖索引的创建</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
